package dev42gewinnt.logik;

public interface Spielfeld 
{
	/**
	 * Moegliche Zuege ermitteln
	 * @return Array mit Feldern, in die gesetzt werden koennte (1 - 7 Felder, abh. von Anzahl freier Spalten)
	 */
	public int[] getMoeglicheZuege();
	
	/**
	 * Einen Zug setzen in bestimmtes Feld im Spielfeld
	 * @param eignerSpieler Angabe, ob Zug des eigenen Spielers oder gegnerischen Spielers
	 * @param feld Feld, in das gesetzt wird
	 */
	public void setzeZug(boolean eigenerSpieler, int feld);
	
	/**
	 * Einen Zug setzen in Spalte im Spielfeld (Verwendung zum Setzen gegnerischer Zuege, die aus Serverfile kommen)
	 * @param eignerSpieler Angabe, ob Zug des eigenen Spielers oder gegnerischen Spielers
	 * @param feld Feld, in das gesetzt wird
	 */
	public void setzeZugInSpalte(boolean eigenerSpieler, int spalte);
	
	/**
	 * Einen gesetzten Zug rueckgaengig machen (= Feld im Spielfeld des Spielers leeren)
	 * @param eigenerSpieler Angabe, ob Zug des eigenen Spielers oder gegnerischen Spielers
	 * @param feld Feld, das zurueckgesetzt werden soll
	 */
	public void entferneZug(boolean eigenerSpieler, int feld);
	
	/**
	 * Bewertung fuer das Spielfeld ausrechnen und zurueckgeben
	 * @param eigenerSpieler Angabe, ob Bewertung fuer eigenen oder gegnerischen Spieler errechnet werden soll
	 * @return Bewertung
	 */
	public int getBewertung(boolean eigenerSpieler);
	
	/**
	 * Pruefung ob Spieler in diesem Spielfeld gewonnen hat
	 * @param eigenerSpieler Angabe, ob fuer eigenen oder gegnerischen Spieler Sieg geprueft werden soll
	 * @return Sieg
	 */
	public boolean pruefeSieg(boolean eigenerSpieler);
	
	/**
	 * Pruefung ob noch freie Spalten im Spielfeld vorhanden sind, in die gesetzt werden kann
	 * @return freie Spalten vorhanden
	 */
	public boolean pruefeObVoll();
	
	/**
	 * Pruefung ob gesamtes Spielfeld noch leer ist
	 * @return alle Felder im Spielfeld leer
	 */
	public boolean pruefeObLeer();
	
	/**
	 * Gibt ein geklontes Objekt des Spielfeld-Objektes zurueck
	 * @return geklontes Objekt des Spielfeld-Objektes
	 */
	public Spielfeld getClone();
	
	/**
	 * Angabe des naechsten freien Feldes in der Spalte
	 * @param spalte Spaltennummer (0 - 6)
	 * @return Nummer des freien Feldes
	 */
	public int getNaechstePositionInSpalte(int spalte);
	
	/**
	 * Gibt bei einer Gewinnsituation die Feldnummern der Gewinnfelder (vier gleiche in einer Reihe) auf dem Spielfeld zurueck
	 * @return Feldnummern der Gewinnfelder oder null, falls keine Gewinnsituation erkannt
	 */
	public int[] getGewinnFelder();
}
